package mtt.us.client.views.fachbereich.editor;

import mtt.us.client.MTTUS;
import mtt.us.client.events.GetModelDataEvent;
import mtt.us.client.events.RefreshViewEvent;
import mtt.us.client.events.SetModelDataEvent;
import mtt.us.client.views.fachbereich.events.StoreFachbereicheEvent;
import mtt.us.dto.FachbereichDTO;
import mtt.us.hmvcFramework.client.hmvc.events.DisposeEvent;

import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

import hmvc4gwt.client.event.HmvcEvent;
import hmvc4gwt.client.event.HmvcEventListener;
import hmvc4gwt.client.view.View;

public class FachbereichEditorView extends View implements HmvcEventListener {

	/**
	 * Button "Abbrechen"
	 */
	private Button buttonCancel = new Button();

	/**
	 * Button "Löschen"
	 */
	private Button buttonDelete;

	/**
	 * Button "Speichern"
	 */
	private Button buttonSave = new Button();

	/**
	 * enthält den Fachbereich der Editiert werden soll
	 */
	private FachbereichDTO fachbereich;

	/**
	 * enthält die Verfügbaren Fachbereichsnummern
	 */
	private ListBox listBoxFachbereichsNummern = new ListBox(false);

	/**
	 * enthält alle Elemente
	 */
	private FlexTable table = new FlexTable();

	/**
	 * enthält den Namen
	 */
	private TextBox textBoxName = new TextBox();

	/**
	 * enthält den Vollständigen Namen des Fachbereichs
	 */
	private TextBox textBoxNameFull = new TextBox();

	/**
	 * fügt bei vorhandenem Fachbereich den Delete-Button hinzu
	 */
	private void addDeleteButton() {
		/*
		 * Button erzeugen, da er nicht immer gebraucht wird
		 */
		buttonDelete = new Button();
		buttonDelete.setText(MTTUS.constants.button_delete());

		/*
		 * Listener zum löschen hinzufügen
		 */
		buttonDelete.addClickListener(new ClickListener() {

			public void onClick(Widget sender) {
				if (getFachbereich().deleteFachbereich()) {
					getController().fireLocalEvent(new DisposeEvent());
				}
			}
		});

		/*
		 * Button zu Tabelle hinzufügen
		 */
		table.setWidget(4, 1, buttonDelete);
	}

	public void doInit() {
		/*
		 * Button-Namen setzen
		 */
		buttonSave.setText(MTTUS.constants.button_save());
		buttonCancel.setText(MTTUS.constants.button_cancel());

		/*
		 * Listener hinzufügen
		 */
		buttonSave.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				getController().fireEvent(
						new StoreFachbereicheEvent(getFachbereich()), true,
						false, false);
				getController().fireLocalEvent(new DisposeEvent());
			}
		});
		
		buttonCancel.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				getController().fireLocalEvent(new DisposeEvent());
			}
		});

		/*
		 * Fachbereichs-Nummer
		 */
		table.setText(0, 0, MTTUS.constants.text_FachbereichsNummer());
		table.setWidget(0, 1, listBoxFachbereichsNummern);

		/*
		 * Name
		 */
		table.setText(1, 0, MTTUS.constants.text_name());
		table.setWidget(1, 1, textBoxName);

		/*
		 * vollständiger Name
		 */
		table.setText(2, 0, MTTUS.constants.text_nameFull());
		table.setWidget(2, 1, textBoxNameFull);

		/*
		 * Buttons hinzufügen
		 */
		table.setWidget(3, 0, buttonSave);
		table.setWidget(3, 1, buttonCancel);

		/*
		 * Events registrieren
		 */
		getController().register(SetModelDataEvent.class, this);
	}

	private FachbereichDTO getFachbereich() {
		
		//TODO Fachbereich aus dem Model holen
		
		if (fachbereich == null) {
			fachbereich = new FachbereichDTO();
		} 

		fachbereich.setName(textBoxName.getText());
		fachbereich.setNameFull(textBoxNameFull.getText());
		// fachbereich.setId((int)
		// listBoxFachbereichsNummern.getItemText(listBoxFachbereichsNummern.getSelectedIndex());

		return fachbereich;
	}

	public Widget getWidget() {
		return table;
	}

	public void handleEvent(HmvcEvent event) {

		if (event instanceof RefreshViewEvent) {
			/*
			 * View-Daten aktualisieren
			 */
			getController().fireLocalEvent(new GetModelDataEvent());

		} else if (event instanceof SetModelDataEvent) {

			if (event.getPayload() instanceof FachbereichDTO) {
				FachbereichDTO fachbereich = (FachbereichDTO) event.getPayload();
				setFachbereich(fachbereich);
			}
		}
	}

	private void setFachbereich(FachbereichDTO fachbereich) {
		this.fachbereich = fachbereich;

		textBoxName.setText(fachbereich.getName());
		textBoxNameFull.setText(fachbereich.getNameFull());
		
		if (fachbereich != null) {
			
			addDeleteButton();
			
		}
	}
}
